package com.sxt;

import java.awt.*;

//红线的类  Line 设置
public class Line {
    int x = 350;        //启点坐标
    int y = 200;        //终点坐标

    int endx = 800;
    int endy = 800;

    //线长
    double length = 100; //长度
    double MIN_length = 100;    //线长最小值
    double MAX_length = 700;    //线长最大值

    double n = 0; //设置角度是垂直

    //方向
    int dir = 1;

    //状态 0摇摆 1抓取 2收回 3抓取返回
    int state;
    //添加钩爪图片
    Image hook = Toolkit.getDefaultToolkit().getImage("C:/Users/mmq/IdeaProjects/The Gold Miner/imgs/hook.png");

    GameWin frame; //接受主窗口的元素

    Line(GameWin frame){this.frame=frame;} //有参构造

    //碰撞检测，检查金块是否被抓取

    void logic() {                //碰撞判断 红线末尾的点是否触碰到金块的矩形图片  从而判断红线抓取
        for (Object obj : this.frame.objectList) {
            if (endx > obj.x && endx < obj.x + obj.width
                    && endy > obj.y && endy < obj.y + obj.height) {
                state = 3; //抓取成功后直接返回状态3
                obj.flag=true;
            }
        }
    }

    //绘制方法
    void lines(Graphics g){
        endx = (int) (x + length*Math.cos(n* Math.PI));   //endx是int类型所以要强制转换一下加（int）
        endy = (int) (y + length*Math.sin(n* Math.PI));   //endx是int类型所以要强制转换一下加（int）
        g.setColor(Color.red);   //绘制红线
        g.drawLine(x-1 ,y-1 ,endx,endy); //画线坐标 因为坐标在上面赋值了     x,y加减1是为了给红线加两条平行线使得红线看起来粗点
        g.drawLine(x ,y ,endx,endy);              //画线坐标 因为坐标在上面赋值了
        g.drawLine(x+1 ,y+1 ,endx,endy); //画线坐标 因为坐标在上面赋值了
        g.drawImage(hook,endx-36,endy-2,null);     //把钩子图片放在红线的终点坐标，图片减一半是正中心
    }



    void painSelf(Graphics g) {                //传入画笔,使用Graphics类进行Java的绘制图线,drawLine画线,在窗口画一条线段，可以使用Graphics类的drawLine()方法：
        logic(); //调用这个判断
        switch (state){              //如果事件是0就左右摇摆
            case 0:
                if(n<0.1) {dir = 1;}//限制n的值可以把线的摆动幅度保持在地面以下
                else if (n>0.9) {dir = -1;}
                n=n+0.005*dir;//让角度的数字不停变化    但是要在GameWin的launch中加个死循环
                lines(g); //引用建了的一个新的lines
                break;
            case 1:
                if (length<MAX_length){      //抓取不能超过最大线长
                    length = length + 10;   // 延长红线
                    lines(g); //引用建了的一个新的lines
                }else {state=2;} //1延长成功后返回 2缩短
                break;
            case 2:
                if (length>MIN_length){       //返回不能低于最小线长
                    length = length - 10;   //收回红线
                    lines(g); //引用建了的一个新的lines
                }else {
                    state=0;            //2收回完了后应该返回 0摇摆状态
                }
                break;
            case 3:
                int m = 1;//成员变量初始值为1，用来接受金块和石块的质量
                if (length>MIN_length){        //返回不能低于最小线长
                    length = length - 10;   //收回红线
                    lines(g); //引用建了的一个新的lines
                    for (Object obj:this.frame.objectList){
                        if (obj.flag){              //true
                            m=obj.m;         //把obj金子或石头的质量赋值给这个成员变量，理论上质量越大约慢
                            obj.x = endx-obj.getWidth()/2;//在父类中添加一个get方法，这样无论是金块和石头都可以拿到图片的一半
                            obj.y = endy;
                            if (length<=MIN_length){   //长度小于等于最小值
                                obj.x=-150;      //抓取成功直接把金块和石头移动到屏幕外
                                obj.y=-150;
                                obj.flag=false;//移动金块石头消失后，将obj的状态修改回来，初始值是false
                                Bg.waterFlag=false;//抓取完成后释放药水
                                Bg.count+= obj.count;//抓取成功后  加积分

                                state=0;         //3抓取完了后直接返回 0摇摆状态
                            }

                            if(Bg.waterFlag){       //判断抓取后 用药水 抓的是金块还是石块的效果药水
                                if (obj.type==1){   //为金块
                                    m=1;            //把质量变为1从而提升抓取速度
                                }
                                if (obj.type==2){   //为石块
                                    //实现石块爆破，相当于移除石块
                                    obj.x=-150;      //抓取成功直接把金块和石头移动到屏幕外
                                    obj.y=-150;
                                    obj.flag=false;//移动金块石头消失后，将obj的状态修改回来，初始值是false
                                    Bg.waterFlag=false;
                                    state=2;
                                }
                            }
                        }

                    }
                }
                try {
                    Thread.sleep(m);                                            //Thread延时来降低刷新频率，从而达到一个拉锯缓慢的动画效果
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                break;
            default:

        }
                /*else {
                    this.frame.gold.x=-150;     //抓取成功直接把金块移动到屏幕外
                    this.frame.gold.y=-150;
                    state=0;            //3抓取完了后直接返回 0摇摆状态
                }*/

    }

    /*重置线*/
     void reGame() {
        n=0;
        length=100;
    }
}
